import java.io.*;
import java.net.*;

class pru_servidor_mon_lect_escr_sx extends Thread {
  private mon_lect_escr_sx m;
  private base_datos bd;
  private SocketBytes Socket;


  public pru_servidor_mon_lect_escr_sx(mon_lect_escr_sx m_in, base_datos bd_in, SocketBytes Socket_in) {
    try {
      m = m_in; bd = bd_in;

      Socket = Socket_in;
    } catch (Exception e) // Imprimir cualquier excepcion
    { System.err.println(e); }
  } // pru_servidor_mon_lect_escr

  private void lector(int id_cliente) {
    int tipo_objeto, tipo_metodo, dato;

    try {
      tipo_objeto = ((Integer) Socket.recibeMensaje()).intValue();
      tipo_metodo = ((Integer) Socket.recibeMensaje()).intValue();

      if (tipo_objeto == 1) { // acceso a monitor
        if (tipo_metodo == 1) {
          m.empezar_leer();
          Socket.enviaMensaje(new Integer(1)); // Comunicacion a cliente
          System.out.println("Cliente " + id_cliente + " puede leer en base datos");
        }
        else if (tipo_metodo == 2) {
          m.acabar_leer();
          Socket.enviaMensaje(new Integer(1)); // Comunicacion a cliente
          System.out.println("Cliente " + id_cliente + " deja de leer en base datos");
        }
        else
          System.out.println("ERROR ACCESO A MONITOR COMO LECTOR. CLIENTE " + id_cliente);
      } 
      else { // (tipo_objeto == 1) acceso a base de datos para leer
        if (tipo_metodo != 1) 
          System.out.println("ERROR ACCESO A BASE DE DATOS PARA LEER. CLIENTE " + id_cliente);
        dato = bd.leer();
        Socket.enviaMensaje(new Integer(dato)); // Comunicacion a cliente de dato leido
        System.out.println("Cliente " + id_cliente + " lee en base datos, el valor " + dato);
      }        
    } catch (Exception e) { return; }
  } // lector

  private void escritor(int id_cliente) {
    int tipo_objeto, tipo_metodo, dato;

    try {
      tipo_objeto = ((Integer) Socket.recibeMensaje()).intValue();
      tipo_metodo = ((Integer) Socket.recibeMensaje()).intValue();

      if (tipo_objeto == 1) { // acceso a monitor
        if (tipo_metodo == 3) {
          m.empezar_escribir();
          Socket.enviaMensaje(new Integer(1)); // Comunicacion a cliente
          System.out.println("Cliente " + id_cliente + " puede escribir en base datos");
        }
        else if (tipo_metodo == 4) {
          m.acabar_escribir();
          Socket.enviaMensaje(new Integer(1)); // Comunicacion a cliente
          System.out.println("Cliente " + id_cliente + " deja de escribir en base datos");
        }
        else
          System.out.println("ERROR ACCESO A MONITOR COMO ESCRITOR. CLIENTE " + id_cliente);
      } 
      else { // (tipo_objeto == 2) acceso a base de datos para escribir
        if (tipo_metodo != 2) 
          System.out.println("ERROR ACCESO A BASE DE DATOS PARA ESCRIBIR. CLIENTE " + id_cliente);

         //MODIFICADO:
        dato = bd.leer();
        Socket.enviaMensaje(dato); //envia al cliente el numero de plazas disponibles
        if (dato > 0) { //si aun quedan plazas
           dato = ((Integer) Socket.recibeMensaje()).intValue(); //el cliente habra decrementado el numero de plazas
           //dato = bd.leer() - 1; //decrementa el numero de plazas 
           bd.escribir(dato);
           Socket.enviaMensaje(new Integer(1)); // Comunicacion a cliente
           System.out.println("Cliente " + id_cliente + " escribe en base datos, el valor " + dato);
        }
        else
           System.out.println("Cliente " + id_cliente + " no ha podido escribir porque no quedan plazas");

      }        
    } catch (Exception e) { return; }
  } // escritor

  public void run() {
    int id_cliente, tipo_cliente;

    try {
      // FALTA LA OPCION DE SALIR DEL BUCLE
      while (true) {    
        id_cliente = ((Integer) Socket.recibeMensaje()).intValue();
        tipo_cliente = ((Integer) Socket.recibeMensaje()).intValue();

        if (tipo_cliente == 1) 
          lector(id_cliente);
        else // (tipo_cliente == 2)
          escritor(id_cliente);
      } // while ...
      // Socket.close();
    } catch (Exception e) // Imprimir cualquier excepcion
    { System.err.println(e); }
  } // run
} // pru_servidor_mon_lect_escr_sx
